﻿//
// Created by LiuYou on 2021/4/11.
//

#include <stdio.h>

// 外部定义的变量
/// 外部链接
int value;

// 外部定义的数组
double array[100];

// 使用了另一个文件中的外部变量ch。ch被定义另一个源代码文件(不一定要有main函数)(MemoryManagement.c)中,所以必须这样声明。
//extern char ch;

/// 内部链接
// 对于该程序所在的编译单元，value和integer都具有文件作用域，但是只有value可以用于其它编译单元(因为它是外部链接的)。
// 但是integer不行，因为它是内部链接的。
static int integer = 100;

/**
 * @brief 介绍定义和声明
 *
 *      #include <stdio.h>
 *
 *      // 定义value 定义式
 *      int value = 100;
 *
 *      int main() {
 *          // 使用在别处定义的value 这种声明是引用式声明。
 *          // 关键字 extern 表明该声明不是定义，因为它指示编译器去别处查询其定义。
 *          // 所以不要用关键字 extern 创建外部定义，只用它来引用现有的外部定义。
 *          extern int value;
 *          // ...
 *          return 0;
 *      }
 *
 *
 * 不要用关键字 extern 创建外部定义，只用它来引用现有的外部定义。
 * 例如:
 *      // file_one.c
 *      char ch = 'a';
 *      ...
 *      // file_two.c
 *      // 错误，因为在file_one.c中的定义式已经创建并初始化了ch变量。而且不要用关键字 extern 创建外部定义，只用它来引用现有的外部定义。
 *      extern char ch = 'b';
 * @return 0
 */
int main() {
// 下面这一行代码是在main函数中重新定义了一个和外部变量名一样的局部变量，会将外部变量value隐藏。
//    int value = 100;
    printf("%d\n", value);

// 下面这一行代码可以写也可以不写。
//    extern int value;
    printf("%d\n", value);

//    printf("%c\n", ch);

    // 使用定义在别处的value，下面这行代码可以省略。
    extern int value;
    // 使用定义在别处的integer，下面这行代码可以省略。
    extern int integer;

    return 0;
}